package com.github.link2fun.support.utils.uuid;

import com.github.link2fun.support.utils.DateUtils;
import com.github.link2fun.support.utils.StringUtils;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * @author ruoyi 序列生成类
 */
public class Seq {
  // 通用序列类型
  public static final String commSeqType = "COMMON";

  // 上传序列类型
  public static final String uploadSeqType = "UPLOAD";

  // 通用接口序列数
  private static final AtomicInteger commSeq = new AtomicInteger(1);

  // 上传接口序列数
  private static final AtomicInteger uploadSeq = new AtomicInteger(1);

  // 机器标识
  private static final String machineCode = "A";

  /**
   * 获取通用序列号
   *
   * @return 序列值
   */
  public static String getId() {
    return getId(commSeqType);
  }

  /**
   * 默认16位序列号 yyMMddHHmmss + 一位机器标识 + 3长度循环递增字符串
   *
   * @return 序列值
   */
  public static String getId(String type) {
    AtomicInteger atomicInt = commSeq;
    if (uploadSeqType.equals(type)) {
      atomicInt = uploadSeq;
    }
    return getId(atomicInt, 3);
  }

  /**
   * 通用接口序列号 yyMMddHHmmss + 一位机器标识 + length长度循环递增字符串
   *
   * @param atomicInt 序列数
   * @param length    数值长度
   * @return 序列值
   */
  public static String getId(AtomicInteger atomicInt, int length) {
    String result = DateUtils.dateTimeNow();
    result += machineCode;
    result += getSeq(atomicInt, length);
    return result;
  }

  /**
   * 序列循环递增字符串[1, 10 的 (length)幂次方), 用0左补齐length位数
   *
   * @return 序列值
   */
  private synchronized static String getSeq(AtomicInteger atomicInt, int length) {
    // 先取值再+1
    int value = atomicInt.getAndIncrement();

    // 如果更新后值>=10 的 (length)幂次方则重置为1
    int maxSeq = (int) Math.pow(10, length);
    if (atomicInt.get() >= maxSeq) {
      atomicInt.set(1);
    }
    // 转字符串，用0左补齐
    return StringUtils.padl(value, length);
  }
}
